package com.cloud.thread;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.Executors;

/**
 * 定时任务异步线程配置
 *
 * @author yzj
 */
@Configuration
@EnableScheduling
public class AsyncConfiguration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 设定一个长度15的定时任务线程池
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(15));
    }

    /**
     * 异步线程池设置
     * 如果所有的任务都使用异步，线程池执行的话，可以不配置同步任务线程池。
     * 但是使用异步需要注意的是异步线程池的大小配置。异步的线程池默认是无上限的开启线程数的。
     *
     * @return
     */
    @Bean
    SimpleAsyncTaskExecutor simpleAsyncTaskExecutor() {
        SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
        // 设置最大并行数
        simpleAsyncTaskExecutor.setConcurrencyLimit(10);
        // 设置为守护线程
        simpleAsyncTaskExecutor.setDaemon(true);
        return simpleAsyncTaskExecutor;
    }

}
